/**
 * @file URL处理工具
 * @description 提供应用内部URL的构建和转换功能
 * @author 黄敏
 * @version 1.0.0
 * @since 2025-08-12
 */

import isEmpty from 'lodash/isEmpty'
import { parseSpecialUrl } from '~shared/utils/urlUtils'
import { BASE_ROOT_URL, getWindowUrl } from './paths'

/**
 * 构建应用URL
 * @description 根据窗口名和参数构建完整的文件URL
 * @param windowName - 窗口目录名
 * @param params - 查询参数对象
 * @param hash - 哈希值
 * @returns 构建的完整URL
 * @example
 * ```ts
 * buildFileUrl('settings', { theme: 'dark' }, 'appearance')
 * // 返回: 'file:///path/to/srcRenderer/windows/settings/index.html?theme=dark#appearance'
 * ```
 */
export function buildFileUrl(
  windowName: string,
  params?: Record<string, string>,
  hash?: string
): string {
  try {
    let url = getWindowUrl(windowName)

    if (!isEmpty(params)) {
      url += `?${new URLSearchParams(params).toString()}`
    }

    if (hash) {
      url += `#${hash}`
    }

    return url
  } catch (error: unknown) {
    console.error('构建应用 URL 时出错:', error)
    throw new Error(`构建应用 URL 失败: ${error instanceof Error ? error.message : String(error)}`)
  }
}

/**
 * 转换为文件URL
 * @description 将 f2:// 协议的URL转换为可以在WebContents中加载的文件URL
 * @param url - 应用协议URL
 * @returns 文件URL
 * @example
 * ```ts
 * toFileUrl('f2://settings?theme=dark#appearance')
 * // 返回: 'file:///path/to/srcRenderer/windows/settings/index.html?theme=dark#appearance'
 * ```
 */
export function toFileUrl(url: string): string {
  try {
    const parsed = parseSpecialUrl(url)
    if (!parsed) return url

    return buildFileUrl(parsed.path, parsed.query, parsed.hash)
  } catch (error) {
    console.error('Error converting to file URL:', error)
    return url
  }
}

/**
 * 转换为应用URL
 * @description 将文件URL转换为应用内部的协议URL
 * @param url - 文件URL
 * @returns 应用协议URL
 * @example
 * ```ts
 * toAppUrl('file:///path/to/srcRenderer/windows/settings/index.html?theme=dark')
 * // 返回: 'f2://settings?theme=dark'
 * ```
 */
export function toAppUrl(url: string): string {
  try {
    // 如果不是以baseUrl开头的URL,直接返回原URL
    if (!url.startsWith(BASE_ROOT_URL)) {
      return url
    }

    // 转义 baseUrl 中的特殊字符
    // const escapedBaseUrl = BASE_ROOT_URL.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
    const pattern = new RegExp(`${BASE_ROOT_URL}/srcRenderer/windows/([^/]+)/index.html(.*)$`)
    const match = url.match(pattern)
    if (!match) {
      return url
    }

    const [, windowName, rest = ''] = match
    return `f2://${windowName}${rest}`
  } catch (error: unknown) {
    console.error('Error converting to app URL:', error)
    return url
  }
}
/**
 * 判断是否为内部URL
 * @description 检查URL是否为应用内部URL，包括f2://协议和内部文件URL
 * @param url - 要检查的URL
 * @returns 是否为内部URL
 * @example
 * ```ts
 * isInternalUrl('f2://settings?theme=dark')
 * // 返回: true
 *
 * isInternalUrl('file:///path/to/srcRenderer/windows/settings/index.html')
 * // 返回: true
 *
 * isInternalUrl('https://www.example.com')
 * // 返回: false
 * ```
 */
export function isInternalUrl(url: string): boolean {
  try {
    // 检查是否为f2://协议的URL
    const parsed = parseSpecialUrl(url)
    if (parsed && parsed.protocol === 'f2') {
      return true
    }

    // 检查是否为内部文件URL
    if (url.startsWith(BASE_ROOT_URL)) {
      const pattern = new RegExp(`${BASE_ROOT_URL}`)
      return pattern.test(url)
    }

    return false
  } catch (error: unknown) {
    console.error('判断内部URL时出错:', error)
    return false
  }
}

// ==================== 默认导出 ====================

/**
 * 默认导出对象，包含所有URL功能
 * @description 为了保持向后兼容性，提供新旧接口映射
 */
export default {
  buildFileUrl,
  toFileUrl,
  toAppUrl,
  isInternalUrl
}
